package day18;

import java.util.concurrent.atomic.AtomicInteger;

//模拟乐观锁：搞个计数器模拟版本号每次加1
public class Demo3 {
    //是原子类：具有原子操作，java内置的一个线程安全的计数器
    AtomicInteger count=new AtomicInteger(0);
    public void increamt(){
        String name=Thread.currentThread().getName();
        int courrentValue; //当前值
        int newValue;  //最新的值
        while (true){
            //获取当前的值
            courrentValue=count.get();
            //如果可以修改，要把计数器的值夜修改
            newValue=courrentValue+1;
            //表示尝试修改计数器的值和currentValue是一样的
            //说明没有被别人改过，那么计数器就可以更新成newValue
            //否则更新失败
            boolean b=count.compareAndSet(courrentValue,newValue);
            if (b){
                System.out.println(name+"尝试更新成功，当前值："+courrentValue+
                        ",计数器的值:"+count.get()+",没有 被修改。");
                break;
            }
            else System.out.println(name+"尝试更新失败，当前值："+courrentValue+
                    ",计数器的值:"+count.get()+",被其他线程改了。");
        }
    }
    public static void main(String[] args) throws InterruptedException {
         Demo3 d=new Demo3();
         Thread t1=new Thread(()->{
             for (int i=0;i<10000;i++){
                 d.increamt();
             }
         },"A");
         Thread t2=new Thread(()->{
             for (int i=0;i<10000;i++){
                 d.increamt();
             }
         },"B");

         t1.start();
         t2.start();

         t1.join();
         t2.join();
         System.out.println("最终计数器的值为："+d.count.get());
    }
}
